home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Software Contest 3 / FM Towns Software Contest 3.iso / exp / bpp / no1 / bppbe.doc < prev    next >
Text File  |  1994-01-07  |  8KB  |  316 lines

  1.  
  2.                                                                        BPP入門
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.        ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
  16.        ☆                              ☆
  17.        ☆            BPP 入門            ☆
  18.        ☆                              ☆
  19.        ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.                              ------  目次  ------
  27.  
  28.                     §1 マクロを使おう      - 2 -
  29.                     §2 ブロック構文を使おう    - 3 -
  30.                     §3 定義サブルーチンを使おう  - 6 -
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.                                     - 1 -
  64.  
  65.                                                                        BPP入門
  66.  
  67.  
  68.  
  69. ▼△  §1 マクロを使おう  △▼
  70.  
  71.  
  72.     「マクロって何だ?」と、早速首をひねっている人もあるかもしれませんが、論よ
  73.     り証拠、とりあえずやってみましょう。次のようなプログラムがあるときあなたな
  74.     らどうしますか?
  75.  
  76.     D$にはあるデータベースファイルの一部が入っていて、3桁の数字+文字列の形
  77.     式でデータが格納されている。
  78.     D$から数字部分と文字列部分を切り分けて、文字列を配列R$(数字)に代入せ
  79.     よ。
  80.  
  81.     <D$>の例
  82.  
  83.         D$ = "012 This is a pen."
  84.  
  85.     BPPでは行番号がありませんから、普通に書くとこうなります。
  86.  
  87.         N$ = LEFT$ ( D$ , 3 )
  88.         S$ = MID$ ( D$ , 4 )
  89.         R$ ( VAL ( N$ ) ) = S$
  90.  
  91.     ところがこれをプログラム中のあちこちで使うとすれば、結構面倒ですよね。
  92.     また、変数名が変更されたときも面倒です。では次の例ではどうでしょう。
  93.  
  94.         DEF FNN ( X$ ) = VAL ( LEFT$ ( X$ , 3 ) )
  95.         DEF FNS$ ( X$ ) = MID$ ( X$ , 4 )
  96.                 :
  97.                 :
  98.         R$ ( FNN ( D$ ) ) = FNS$ ( X$ )
  99.  
  100.     これでもまだ回りくどい感じがします。
  101.     さりとて、サブルーチンにするほどの事もなさそうです。
  102.     ここで、BPPの強力なマクロ機能を使えば、問題は解決します。
  103.  
  104.         #DEFINE STORE ( X ) R$ ( VAL ( LEFT$ ( X , 3 ) ) ) = MID$ ( X , 4 )
  105.                 :
  106.                 :
  107.         STORE ( D$ )
  108.  
  109.     随分すっきりしましたね。
  110.  
  111.     マクロ置換はDEF FNと違って、仮引数に変数の型をつけてはいけません。
  112.     DEF FNはBASICの命令として解釈されますが、#DEFINEによるマ
  113.     クロ置換はSEDなどと同じで、単なるテキスト置換です。
  114.  
  115.     マクロは、次のような置換も出来ます。
  116.  
  117.         #DEFINE MAX 10
  118.         DIM FOO ( MAX ) , BAR ( MAX )
  119.                 :
  120.                 :
  121.  
  122.     プログラム中のMAXは全て10に置換されます。
  123.  
  124.  
  125.  
  126.                                     - 2 -
  127.  
  128.                                                                        BPP入門
  129.  
  130.  
  131.  
  132. ▼△  §2 ブロック構文を使おう  △▼
  133.  
  134.  
  135.     次のフローチャート(もどき)を見てください。
  136.  
  137.    OCCCCCCCCCCCCCCCCS
  138.       E FLAGが1か _CCCCCCCCCCCCCCCS
  139.       WCCCCCCCCoCCCCCCC[               E
  140.                E                       E
  141.          OCCCCCwCCCCCS           OCCCCCwCCCCCS
  142.          E  処理 1 E           E  処理 2 E
  143.          WCCCCCoCCCCC[           WCCCCCoCCCCC[
  144.                E                       E
  145.                _CCCCCCCCCCCCCCCCCCCCCCC[
  146.                E
  147.       OCCCCCCCCCCCCCCCCS
  148.       E    次の処理    E
  149.       WCCCCCCCCCCCCCCCC[
  150.  
  151.     これをBASICのプログラムにすると、
  152.  
  153.         IF FLAG = 1 THEN 処理1 ELSE 処理2
  154.         次の処理
  155.  
  156.     となります。でも、処理1や処理2が1行に書き切れない場合はどうしますか?
  157.     こういう方法があります。
  158.  
  159.         IF FLAG <> 1 THEN *FLAGNOT1
  160.             処理1
  161.             GOTO *NEXTPROCESS
  162.         *FLAGNOT1
  163.             処理2
  164.         *NEXTPROCESS
  165.  
  166.     GOTOが多くて読みにくくなってしまいました。
  167.     BPPなら次のように書くことが出来ます。
  168.  
  169.         IF FLAG = 1 THEN
  170.             処理1
  171.         ELSE
  172.             処理2
  173.         ENDIF
  174.  
  175.     これで随分読みやすくなりました。このような構文をブロックIFと呼びます。
  176.     ブロックIFでも通常のIF文と同じ様にELSE節を省略できますが、
  177.     ENDIFは省略できません。
  178.  
  179.     では、次のような場合はどうしたらよいでしょう。
  180.  
  181.         A$が”A”のときは処理A
  182.              ”B”のときは処理B
  183.                    :
  184.                    :
  185.  
  186.  
  187.  
  188.  
  189.                                     - 3 -
  190.  
  191.                                                                        BPP入門
  192.  
  193.  
  194.  
  195.     これを前のようにプログラムにすると、
  196.  
  197.         IF A$ = "A" THEN
  198.             処理A
  199.         ELSE
  200.             IF A$ = "B" THEN
  201.                 処理B
  202.             ELSE
  203.                 IF A= "C" THEN
  204.                     処理C
  205.                 ELSE
  206.                     :
  207.                     :
  208.                 ENDIF
  209.             ENDIF
  210.         ENDIF
  211.  
  212.     これはまた読みにくいですね。
  213.     この場合は、次のように書くことが出来ます。
  214.  
  215.         IF A$ = "A" THEN
  216.             処理A
  217.         ELSEIF A$ = "B" THEN
  218.             処理B
  219.         ELSEIF A$ = "C" THEN
  220.             処理C
  221.         ELSEIF A$ = "D" THEN
  222.                 :
  223.                 :
  224.         ENDIF
  225.  
  226.     ELSEIFは、ELSEとIFをまとめたもので、このような場合にとても便利
  227.     です。
  228.  
  229.     今度は次の例を見てください。
  230.  
  231.         OPEN "FILE.TXT" FOR INPUT AS #1
  232.         FOR I = 1 TO 10
  233.             IF EOF(1) THEN *QUIT
  234.             LINE INPUT#1 , L$
  235.             PRINT L$
  236.         NEXT
  237.         *QUIT
  238.         CLOSE
  239.         END
  240.  
  241.     これは、FILE.TXTの先頭から10行を表示するプログラムです。
  242.     FILE.TXTの長さが10行未満の時にはファイルの終わりで打ち切ります。
  243.     ここでは、ファイルの終わりをEOF関数で検出してGOTOでループを抜けてい
  244.     ますが、このGOTOもBPPでは不要です。
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.                                     - 4 -
  253.  
  254.                                                                        BPP入門
  255.  
  256.  
  257.  
  258.         OPEN "FILE.TXT" FORINPUT AS #1
  259.         FOR I=1 TO 10
  260.             IF EOF(1) THEN BREAK
  261.             LINE INPUT#1 , L$
  262.             PRINT L$
  263.         NEXT
  264.         CLOSE
  265.         END
  266.  
  267.     BREAKは、FOR、WHILE、DOのループを1段抜け出します。
  268.  
  269.     BPPにはCライクなFOR文があり、それを使えばもっとすっきりします。
  270.  
  271.         OPEN "FILE.TXT" FOR INPUT AS #1
  272.         FOR I = 1 , I < 10 AND EOF(1) = 0 , I = I + 1
  273.             LINE INPUT#1 , L$
  274.             PRINT L$
  275.         NEXT
  276.         CLOSE
  277.         END
  278.  
  279.     この書き方だと、ループの終了条件がよりはっきりしますね。
  280.     これをWHILEをつかって書き換えてみると、動作がはっきりします。
  281.  
  282.         OPEN "FILE.TXT" FOR INPUT AS #1
  283.         I = 1        '←FOR文の1番目の式
  284.         WHILE I <= 10 AND EOF(1) = 0    '←2番目の式
  285.             LINE INPUT#1 ,L$
  286.             PRINT L$
  287.             I = I + 1
  288.         WEND
  289.         CLOSE
  290.         END
  291.  
  292.     ここではDO~LOOPは使えません。
  293.     WHILE~WENDでは、  ループ本体を実行する前に条件式を評価しますが、
  294.     DO~LOOPは、ループ本体を実行した後で条件式を評価します。
  295.     この場合、DO~LOOPを使うと、”FILE. TXT” の大きさが0のとき
  296.     (内容が空のとき)LINE INPUT#文でエラーが発生してしまいます。
  297.  
  298.     逆に次のような場合は、WHILE~WENDでは不都合です。
  299.  
  300.         WHILE A$ = ""
  301.             A$ = INKEY$    '←実行されない。
  302.         WEND
  303.  
  304.     これは何かキーが押されるまで末というプログラムですが、もしA$が始めから空
  305.     (””)だったら、ループの中身は実行されませんから何もキーが押されなくても
  306.     先に進んでしまいます。
  307.  
  308.         DO
  309.             A$ = INKEY$
  310.         LOOP A$ = ""
  311.  
  312.     これが正しい形です。
  313.  
  314.  
  315.                                     - 5 -
  316.